//
// Created by Administrator on 5/12/2025.
//
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        // 初始化哈希表，存储前缀和及其出现次数，初始状态存入{0:1}用于处理前缀和直接等于k的情况[1,4,7](@ref)
        unordered_map<int, int> prefix_map{{0, 1}};
        int pre_sum = 0, count = 0; // pre_sum记录当前前缀和，count记录符合条件的子数组数量

        for (int num : nums) {
            pre_sum += num; // 累加当前元素，计算到当前位置的前缀和[6,7](@ref)

            // 检查是否存在前缀和等于(pre_sum - k)，存在则累加对应次数[2,4,7](@ref)
            if (prefix_map.find(pre_sum - k) != prefix_map.end()) {
                count += prefix_map[pre_sum - k]; // 找到匹配的前缀和差值，增加计数
            }

            // 将当前前缀和存入哈希表（若已存在则次数+1）[1,6,7](@ref)
            prefix_map[pre_sum]++; // 此操作保证后续遍历时能正确统计历史前缀和
        }
        return count; // 返回最终统计结果
    }
};